#ifndef TEST_BOOST_TRAIT_
#define TEST_BOOST_TRAIT_


/**
 * 提供一组特征类----元函数，可以在编译期确定类型(元数据)是否具有某些特征
 *  例如：是否是原生数组，整数，是否重载了 operator<
 *  还可以检查两个类型是否是同一个类型，或者为类型添加或移除 const、volatile等修饰词
 * 这些特征类都在编译期执行，不会存在任何运行时的效率损失
 */
#include <boost/type_traits.hpp>
#include <boost/assert.hpp>

using namespace boost;

#define mp_arglist template         // 元函数参数列表开始
#define mp_arg typename             // 元函数参数声明
#define mp_function struct          // 元函数定义
#define mp_data typedef             // 元数据定义
#define mp_return(T) mp_data T type // 元函数返回
#define mp_exec(Func) Func::type    // 获取元函数返回结果(类型)，返回一个新类型
#define mp_eval(Func) Func::value   // 获取元函数返回值(值)


template <typename T1>
void check_simple_type()
{

    assert(is_integral<T1>::value);
    assert(mp_eval(is_integral<T1>));        // 判断T1是否是bool、char、int、long等整型
    assert(!mp_eval(is_floating_point<T1>)); // 判断T1是否是float、double、long double等整型
    assert(!mp_eval(is_void<T1>));           // 判断T1是否是void类型
}

#endif